package com.easywan.service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.easywan.dao.BaseManagerUserDao;
import com.easywan.pojo.IResult;
import com.easywan.pojo.IResultSupport;
import com.easywan.vo.BaseManagerUser;

import junit.framework.Assert;
/**
 * 后台管理用户服务类
 * @author tangkang
 *	
 */
public class BaseManagerUserService implements IBaseManagerUserService{
	@Autowired
	private BaseManagerUserDao userDao;
	/**
	 * @Transactional
	 * 一.参数
	 * value	String	可选的限定描述符，指定使用的事务管理器
	 * propagation	enum: Propagation	可选的事务传播行为设置
	 * isolation	enum: Isolation	可选的事务隔离级别设置
	 * readOnly	boolean	读写或只读事务，默认读写
	 * timeout	int (in seconds granularity)	事务超时时间设置
	 * rollbackFor	Class对象数组，必须继承自Throwable	导致事务回滚的异常类数组
	 * rollbackForClassName	类名数组，必须继承自Throwable	导致事务回滚的异常类名字数组
	 * noRollbackFor	Class对象数组，必须继承自Throwable	不会导致事务回滚的异常类数组
	 * noRollbackForClassName	类名数组，必须继承自Throwable	不会导致事务回滚的异常类名字数组
	 * 二.参数详解	
	 * propagation:
	 * 		1.Propagation.REQUIRED 如果有事务， 那么加入事务， 没有的话新建一个(默认情况下)
	 * 		2.Propagation.NOT_SUPPORTED 容器不为这个方法开启事务
	 * 		3.Propagation.REQUIRES_NEW不管是否存在事务，都创建一个新的事务，原来的挂起，新的执行完毕，继续执行老的事务
	 * 		4.Propagation.MANDATORY	必须在一个已有的事务中执行，否则抛出异常
	 * 		5.Propagation.NEVER		必须在一个没有的事务中执行，否则抛出异常(与Propagation.MANDATORY相反)
	 * 		6.Propagation.SUPPORTS	如果其他bean调用这个方法，在其他bean中声明事务，那就用事务。如果其他bean没有声明事务，那就不用事务
	 * timeout: 30//默认是30秒
	 * isolation:
	 * 		1.Isolation.READ_UNCOMMITTED 读取未提交数据(会出现脏读， 不可重复读) 基本不使用
	 * 		2.Isolation.READ_COMMITTED  读取已提交数据(会出现不可重复读和幻读)
	 * 		3.Isolation.REPEATABLE_READ 可重复读(会出现幻读) 
	 * 		4.Isolation.SERIALIZABLE  串行化
	 * 三.工作原理
	 * 	1.自动提交:默认情况下，数据库处于自动提交模式。隐式的提交事务,隐式的回滚事务
	 * 	2.事务管理，是一组相关的操作处于一个事务之中，因此必须关闭数据库的自动提交模式。
	 * 	  spring会在org/springframework/jdbc/datasource/DataSourceTransactionManager.java中
	 *	     将底层连接的自动提交特性设置为false。
	 *	3.spring事务回滚规则：
	 *		推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常，然后依据规则决定是否回滚抛出异常的事务。
	 *		默认配置下，spring只有在抛出的异常为运行时unchecked异常时才回滚该事务，也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚)，而抛出checked异常则不会导致事务回滚。
	 *	4.
	 */
	@Transactional(value = "transactionManager",propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
	public IResult add(String name, String emial, String pwd, 
			String mobile, Integer creater) {
		Date date = new Date();
		Assert.assertNotNull(name);
		Assert.assertNotNull(pwd);
		Assert.assertNotNull(mobile);
		Assert.assertNotNull(creater);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("name", name);
		params.put("pwd", pwd);
		params.put("mobile", mobile);
		params.put("email", emial);
		params.put("creater", creater);
		
		params.put("createtime", date);
		params.put("modifytime", date);
		
		userDao.add(params);
		
		return IResultSupport.buildResult(IResult.SUCCESS_CODE,"添加成功");
	}
	/**
	 * 用户登录
	 */
	public BaseManagerUser login(String name, String pwd) {
		Assert.assertNotNull(name);
		Assert.assertNotNull(pwd);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("name", name);
		params.put("pwd", pwd);
		BaseManagerUser user = userDao.getOne(params);
		if(user == null) throw new RuntimeException("登录失败");
		return user;
	}

}
